package wodegua.d29_多线程;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Executors
 * 是一个线程池的工具类，提供了很多静态方法用于返回不同特点的线程池对象。
 * 方法名称
 * public static ExecutorService newFixedThreadPool(int nThreads)   创建固定线程数量的线程池，如果某个线程因为执行异常而结束，那么线程池会补充一个新线程替代它。
 * public static ExecutorService newSingleThreadExecutor()      创建只有一个线程的线程池对象，如果该线程出现异常而结束，那么线程池会补充一个新线程。
 * public static ExecutorService newCachedThreadPool()      线程数量随着任务增加而增加，如果线程任务执行完毕且空闲了60s则会被回收掉。
 * public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)      创建一个线程池，可以实现在给定的延迟后运行任务或者定期执行任务。
 * 注意:这些方法的底层，都是通过线程池的实现类ThreadPoolExecutor创建的线程池对象。
 *
 * Executors使用可能存在的陷阱
 * 大型并发系统环境中使用Executors如果不注意可能会出现系统风险。
 * 阿里巴巴 Java 开发手册
 * 4.【强制】线程池不允许使用 Executors 去创建，而是通过 ThreadPoolExecutor 的方式，这样的处理方式让写的同学更加明确线程池的运行规则，规避资源耗尽的风险。
 * 说明:Executors 返回的线程池对象的弊端如下:
 * 1)FixedThreadPool和SingleThreadPool:允许的请求队列长度为 Integer.MAX_VALUE，可能会堆积大量的请求，从而导致 OOM。
 * 2)CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为 Integer.MAX_VALUE，可能会创建大量的线程，从而导致 OOM。
 */
public class d8_ThreadExecutors {
     public static void main(String[] args) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        // 老师:核心线程数最到底配置多少呢???
        // 计算密集型的任务:核心线程数量=CPU的核数+1
        // IO密集型的任务:核心线程数量=CPU核数*2

         System.out.println(pool.submit(new MyCallablePool(100)).get());
         System.out.println(pool.submit(new MyCallablePool(200)).get());
         System.out.println(pool.submit(new MyCallablePool(300)).get());
         System.out.println(pool.submit(new MyCallablePool(400)).get());
     }
}
